home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
gfx
/
misc
/
lise20.lha
/
lise2.0
/
mdl
/
src
/
mdllib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-31
|
56KB
|
2,071 lines
/*
Library routines to support Menu and Gadget primitives
in an easy (and hopefully Computer independent) way.
In stead of using the conventional STATIC structure initialization,
these routines support DYNAMIC structure initialization, which
is more flexible and easier to use.
All primitives (Push buttons, toggle buttons, scalers, selection boxes,
String boxes and Menustrips) are added to the new_window pointer
using the Function add_item.
Look at the file skeletton.c for examples on how to use this library
*/
#include <stdio.h>
#include <math.h>
#include <exec/types.h>
#include <exec/ports.h>
#include <exec/tasks.h>
#include <exec/libraries.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <exec/exec.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/view.h>
#include <graphics/rastport.h>
#include <graphics/layers.h>
#include <graphics/display.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <workbench/icon.h>
#define PUSH 1
#define TOGGLE 2
#define SCALEX 3
#define SCALEY 4
#define DIALOG 5
#define MENU 6
#define NEW_MENU 7
#define FILE_SELECT 8
#define BOARD 9
#define BULLETIN 10
#define SELECTION 11
#define MESSAGE 12
#define RADIO 13
#define ROWCOL 14
#define SCALEX11 15
#define SCALEY11 16
#define STRING 17
#define INTEGER 18
#define FLOAT 19
#define SCALEX00 20
#define SCALEY00 21
#define SELBOXGAD 201
#define FSELBOXGAD 202
#define FSELSTRING 203
#define SPECIALPRO 204
#define SPECIALPAR 205
#define SPECIALOK 206
#define SPECIALCAN 207
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase;
struct Library *AslBase;
struct Screen *WBScreen = NULL;
struct Window *my_window;
struct Window *prop_window;
struct Gadget *prop_gadget;
struct NewWindow *my_new_window;
struct Menu *menu_bar=NULL;
struct RastPort *rp; /* RastPort - Zeiger */
struct IntuiMessage *message; /* IntuiMessage - Zeiger */
struct TmpRas tmp;
struct TextAttr topaz_font = {
/* STRPTR ta_Name */ "topaz.font",
/* UWORD ta_YSize */ 8,
/* UBYTE ta_style */ 0,
/* UBYTE ta_flags */ 0
};
struct FileRequester {
APTR rf_Reserved1;
BYTE *rf_File; /* Filename pointer */
BYTE *rf_Dir; /* Directory name pointer */
WORD rf_Reserved2[5];
SHORT rf_LeftEdge,rf_TopEdge; /* Preferred window pos */
SHORT rf_Width,rf_Height; /* Preferred window size */
SHORT rf_Reserved3;
LONG rf_NumArgs; /* A-la WB Args, for multiselects */
struct WBArg *rf_ArgList;
APTR rf_UserData; /* Applihandle (you may write!!) */
};
struct FileRequester *AllocFileRequest();
void FreeFileRequest(struct FileRequester *ptr);
char *RequestFile(struct FileRequester *ptr);
#ifdef MANX
#pragma amicall(AslBase,30,AllocFileRequest())
#pragma amicall(AslBase,36,FreeFileRequest(A0))
#pragma amicall(AslBase,42,RequestFile(A0))
#endif
#ifdef SAS
#pragma libcall AslBase AllocFileRequest 1E 0
#pragma libcall AslBase FreeFileRequest 24 801
#pragma libcall AslBase RequestFile 2A 801
#endif
USHORT *PointerMatrix;
int propdwn = 0;
int last_gadgetid = 0;
int menu_line = 0;
int menu_column = 0;
int fn_number = 0;
int top_slider = -1;
void (*fn_command[160])();
int *var_value[160];
int var_funct[160];
int scale_var0[160];
int scale_var1[160];
int selector[160];
int acc_x=0; /* accumulated x */
int acc_y=0; /* accumulated y */
int bas_y=5; /* base scale for y-increment */
int fin_flg=FALSE; /* tells the MainLoop to termitate */
char menu_name[80]; /* store menu bar name */
char return_string[80]; /* string returned from dialog box */
char last_dir[80];
char last_file[80];
extern struct WBStartup *WBenchMsg;
extern struct IconBase *IconBase;
struct memtree {
struct memtree *Next;
char *memory;
} *mem_status = NULL;
/* --------------------------------------------------------------
allocate memory for possible deallocation of a whole tree
-------------------------------------------------------------- */
char *tree_alloc(amount)
int amount;
{
struct memtree *memory;
if(mem_status == NULL)
mem_status = (struct memtree *) malloc(sizeof(struct memtree));
memory = (struct memtree *) malloc(amount + sizeof(struct memtree));
memory->Next = NULL;
mem_status->Next = memory;
return(&memory->memory);
}
/* --------------------------------------------------------------
free a whole tree of memory allocated by tree_alloc
-------------------------------------------------------------- */
void tree_free(start)
struct memtree *start;
{
struct memtree *entry;
mem_status = start;
entry = start;
while(entry->Next != NULL) {
start = entry->Next;
free(entry);
entry = start;
}
}
/* --------------------------------------------------------------
read directory information into buffer. directories are
preceeded by a /
-------------------------------------------------------------- */
void read_dir(subdir,buffer)
char subdir[];
char *buffer[];
{
struct FileLock *actdir;
struct FileInfoBlock *dirinfo;
char s[80],z[80];
int n,m,i,p;
dirinfo = (struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),0L);
actdir = (struct FileLock *) Lock(subdir,-2);
if(actdir == 0) {
for(n=0;n<300;n++) {
if(buffer[n] != NULL) free(buffer[n]);
buffer[n] = NULL;
}
FreeMem(dirinfo,sizeof(struct FileInfoBlock));
return;
}
n = Examine(actdir,dirinfo);
p = 0;
while(n != 0) {
n = ExNext(actdir,dirinfo);
if(n == 0) break;
m = 1; i = 0;
while(m != 0) {
m = dirinfo->fib_FileName[i];
s[i++] = m;
}
if(dirinfo->fib_DirEntryType > 0) {
strcpy(z,"/");
} else {
strcpy(z," ");
}
strcat(z,s);
if(buffer[p] == NULL) buffer[p] = (char *) malloc(32);
strcpy(buffer[p],z);
p = p + 1;
}
for(n=p;n<300;n++) {
if(buffer[n] != NULL) free(buffer[n]);
buffer[n] = NULL;
}
/* ---------- Sorting buffer :--------- */
for(n = 1; n < (p - 1); n++) {
i = TRUE;
for(m = 0; m < (p - n); m++) {
if(strcmp(buffer[m],buffer[m+1]) > 0) {
strcpy(z,buffer[m]);
strcpy(buffer[m],buffer[m+1]);
strcpy(buffer[m+1],z); i = FALSE;
}
}
if(i) break;
}
/* ---------- end sorting ------------- */
UnLock(actdir);
FreeMem(dirinfo,sizeof(struct FileInfoBlock));
}
/* --------------------------------------------------------------
Draw a border for prop gadgets
-------------------------------------------------------------- */
void DrawPropBorder(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
int sx,sy,ex,ey;
struct RastPort *rp;
rp = window->RPort;
sx = gadget->LeftEdge;
sy = gadget->TopEdge;
ex = sx + gadget->Width - 1;
ey = sy + gadget->Height - 1;
SetAPen(rp,0);
Move(rp,sx,sy); Draw(rp,sx,ey);
SetAPen(rp,1);
Move(rp,sx+1,ey); Draw(rp,sx+1,sy);
Draw(rp,ex,sy);
SetAPen(rp,0);
Move(rp,ex,sy); Draw(rp,ex,ey);
SetAPen(rp,2);
Move(rp,ex-1,sy); Draw(rp,ex-1,ey);
Draw(rp,sx+1,ey);
}
/* --------------------------------------------------------------
only refresh ONE gadget
-------------------------------------------------------------- */
void Refresh1Gadget(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct Gadget *nextgad;
nextgad = gadget->NextGadget;
gadget->NextGadget = NULL;
RefreshGadgets(gadget,window,NULL);
if(gadget->GadgetType == PROPGADGET) DrawPropBorder(gadget,window);
gadget->NextGadget = nextgad;
}
/* --------------------------------------------------------------
initialize NewWindow structure
-------------------------------------------------------------- */
struct NewWindow *init_window(x,y,title,pen1,pen2)
int x,y,pen1,pen2;
char *title;
{
struct NewWindow *window;
char *strptr;
int left, top, wbwidth, wbheight;
if(GfxBase == NULL) GfxBase =
(struct GfxBase *)OpenLibrary("graphics.library",0);
if(IntuitionBase == NULL) IntuitionBase =
(struct IntuitionBase *) OpenLibrary("intuition.library",0);
if(WBScreen == NULL) WBScreen = (struct Screen *)OpenWorkBench();
wbwidth = WBScreen->Width;
wbheight = WBScreen->Height;
left = (wbwidth - x) / 2;
top = (wbheight - y) / 2;
if(left <= 0) {left = 1; x = wbwidth - 2;}
if(top <= 0) {top = 1; y = wbheight -2;}
window = (struct NewWindow *) malloc(sizeof(struct NewWindow));
strptr = (char *) tree_alloc(strlen(title)+1); strcpy(strptr,title);
window->LeftEdge = left;
window->TopEdge = top;
window->Width = x;
window->Height = y;
window->DetailPen = pen1;
window->BlockPen = pen2;
window->IDCMPFlags =
CLOSEWINDOW | GADGETDOWN | GADGETUP | MENUPICK | NEWSIZE;
window->Flags =
SMART_REFRESH | WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | WINDOWSIZING;
window->FirstGadget = NULL;
window->CheckMark = NULL;
window->Title = (UBYTE *) strptr;
window->Screen = WBScreen;
window->BitMap = NULL;
window->MinWidth = 150;
window->MinHeight = 100;
window->MaxWidth = 720;
window->MaxHeight = 560;
window->Type = WBENCHSCREEN;
if(WBScreen->Flags & CUSTOMSCREEN) window->Type = CUSTOMSCREEN;
return(window);
}
/* -------------------------------------------------------------
open a window and return structure
------------------------------------------------------------- */
struct Window *open_win(x,y,title,pen1,pen2)
int x,y,pen1,pen2;
char *title;
{
struct NewWindow *new_window;
struct Window *main_window;
new_window = init_window(x,y,title,pen1,pen2);
main_window = (struct Window *) OpenWindow(new_window);
free(new_window);
return(main_window);
}
/* -------------------------------------------------------------
initialize gadget structure
------------------------------------------------------------- */
struct Gadget *init_gadget(x,y,flg,act,type,my_text,window)
int x,y;
USHORT flg,act,type;
struct IntuiText *my_text;
struct NewWindow *window;
{
struct Gadget *my_gadget;
my_gadget = (struct Gadget *) tree_alloc(sizeof(struct Gadget));
my_gadget->NextGadget = window->FirstGadget;
my_gadget->LeftEdge = acc_x;
my_gadget->TopEdge = acc_y;
my_gadget->Width = x;
my_gadget->Height = y;
my_gadget->Flags = flg;
my_gadget->Activation = act;
my_gadget->GadgetType = type;
my_gadget->GadgetRender = NULL;
my_gadget->SelectRender = NULL;
my_gadget->GadgetText = my_text;
my_gadget->MutualExclude = 0;
my_gadget->SpecialInfo = NULL;
my_gadget->GadgetID = fn_number;
my_gadget->UserData = NULL;
window->FirstGadget = my_gadget;
return(my_gadget);
}
/* --------------------------------------------------------------
initialize intuition text structure
-------------------------------------------------------------- */
struct IntuiText *init_textstruct(left,top)
int top,left;
{
struct IntuiText *my_text;
my_text = (struct IntuiText *) tree_alloc(sizeof(struct IntuiText));
my_text->FrontPen = 1;
my_text->BackPen = 0;
my_text->DrawMode = JAM1;
my_text->LeftEdge = left;
my_text->TopEdge = top;
my_text->ITextFont = &topaz_font;
my_text->IText = NULL;
my_text->NextText = NULL;
return(my_text);
}
struct IntuiText *init_text(title,left,top)
char *title;
int top,left;
{
struct IntuiText *my_text;
char *strptr;
my_text = init_textstruct(left,top);
strptr = (char *) tree_alloc(strlen(title)+1); strcpy(strptr,title);
my_text->IText = (UBYTE *) strptr;
return(my_text);
}
/* --------------------------------------------------------------
add border to gadget
-------------------------------------------------------------- */
void add_border(gadget,x,y)
struct Gadget *gadget;
int x,y;
{
SHORT *my_points1, *my_points2;
struct Border *my_border1, *my_border2, *my_border3, *my_border4;
my_points1 = (SHORT *) tree_alloc(20);
my_points2 = (SHORT *) tree_alloc(20);
my_border1 = (struct Border *) tree_alloc(sizeof(struct Border));
my_border2 = (struct Border *) tree_alloc(sizeof(struct Border));
my_border3 = (struct Border *) tree_alloc(sizeof(struct Border));
my_border4 = (struct Border *) tree_alloc(sizeof(struct Border));
my_points1[0] = x+1 ; my_points1[1] = 0 ;
my_points1[2] = 0 ; my_points1[3] = 0 ;
my_points1[4] = 0 ; my_points1[5] = y+1 ;
my_points2[0] = x+1 ; my_points2[1] = 0 ;
my_points2[2] = x+1 ; my_points2[3] = y+1 ;
my_points2[4] = 0 ; my_points2[5] = y+1 ;
my_border1->LeftEdge = -1;
my_border1->TopEdge = -1;
my_border1->FrontPen = 2;
my_border1->BackPen = 0;
my_border1->DrawMode = JAM1;
my_border1->Count = 3;
my_border1->XY = my_points1;
my_border1->NextBorder = my_border2;
my_border2->LeftEdge = -1;
my_border2->TopEdge = -1;
my_border2->FrontPen = 1;
my_border2->BackPen = 0;
my_border2->DrawMode = JAM1;
my_border2->Count = 3;
my_border2->XY = my_points2;
my_border2->NextBorder = NULL;
my_border3->LeftEdge = -1;
my_border3->TopEdge = -1;
my_border3->FrontPen = 1;
my_border3->BackPen = 0;
my_border3->DrawMode = JAM1;
my_border3->Count = 3;
my_border3->XY = my_points1;
my_border3->NextBorder = my_border4;
my_border4->LeftEdge = -1;
my_border4->TopEdge = -1;
my_border4->FrontPen = 2;
my_border4->BackPen = 0;
my_border4->DrawMode = JAM1;
my_border4->Count = 3;
my_border4->XY = my_points2;
my_border4->NextBorder = NULL;
gadget->GadgetRender = (APTR) my_border1;
gadget->SelectRender = (APTR) my_border3;
}
void add_border2(gadget,x,y)
struct Gadget *gadget;
int x,y;
{
SHORT *my_points1, *my_points2, *my_points3, *my_points4;
struct Border *my_border1, *my_border2, *my_border3, *my_border4;
my_points1 = (SHORT *) tree_alloc(20);
my_points2 = (SHORT *) tree_alloc(20);
my_points3 = (SHORT *) tree_alloc(20);
my_points4 = (SHORT *) tree_alloc(20);
my_border1 = (struct Border *) tree_alloc(sizeof(struct Border));
my_border2 = (struct Border *) tree_alloc(sizeof(struct Border));
my_border3 = (struct Border *) tree_alloc(sizeof(struct Border));
my_border4 = (struct Border *) tree_alloc(sizeof(struct Border));
my_points1[0] = x+1 ; my_points1[1] = 0 ;
my_points1[2] = 0 ; my_points1[3] = 0 ;
my_points1[4] = 0 ; my_points1[5] = y+1 ;
my_points2[0] = x+1 ; my_points2[1] = 0 ;
my_points2[2] = x+1 ; my_points2[3] = y+1 ;
my_points2[4] = 0 ; my_points2[5] = y+1 ;
my_points3[0] = x+3 ; my_points3[1] = 0 ;
my_points3[2] = 0 ; my_points3[3] = 0 ;
my_points3[4] = 0 ; my_points3[5] = y+3 ;
my_points4[0] = x+3 ; my_points4[1] = 0 ;
my_points4[2] = x+3 ; my_points4[3] = y+3 ;
my_points4[4] = 0 ; my_points4[5] = y+3 ;
my_border1->LeftEdge = -1;
my_border1->TopEdge = -1;
my_border1->FrontPen = 1;
my_border1->BackPen = 0;
my_border1->DrawMode = JAM1;
my_border1->Count = 3;
my_border1->XY = my_points1;
my_border1->NextBorder = my_border2;
my_border2->LeftEdge = -1;
my_border2->TopEdge = -1;
my_border2->FrontPen = 2;
my_border2->BackPen = 0;
my_border2->DrawMode = JAM1;
my_border2->Count = 3;
my_border2->XY = my_points2;
my_border2->NextBorder = my_border3;
my_border3->LeftEdge = -2;
my_border3->TopEdge = -2;
my_border3->FrontPen = 2;
my_border3->BackPen = 0;
my_border3->DrawMode = JAM1;
my_border3->Count = 3;
my_border3->XY = my_points3;
my_border3->NextBorder = my_border4;
my_border4->LeftEdge = -2;
my_border4->TopEdge = -2;
my_border4->FrontPen = 1;
my_border4->BackPen = 0;
my_border4->DrawMode = JAM1;
my_border4->Count = 3;
my_border4->XY = my_points4;
my_border4->NextBorder = NULL;
gadget->GadgetRender = (APTR) my_border1;
}
void add_xprop(title,min,max,window,flag)
int min,max;
char *title;
struct NewWindow *window;
int flag;
{
char s[40];
struct IntuiText *my_text, *my_value;
struct Image *my_image;
struct PropInfo *my_prop_info;
struct Gadget *my_gadget;
scale_var0[fn_number]=min;
scale_var1[fn_number]=max;
my_image = (struct Image *) tree_alloc(sizeof(struct Image));
if(flag == 1) {
sprintf(s,"%d",min);
my_value = init_text(s,10,-10);
my_text = init_text(title,0,12);
my_text->NextText = my_value;
} else {
my_text = NULL;
}
my_prop_info = (struct PropInfo *) tree_alloc(sizeof(struct PropInfo));
my_prop_info->Flags = FREEHORIZ | AUTOKNOB;
my_prop_info->HorizPot = 0;
my_prop_info->VertPot = 0;
my_prop_info->HorizBody = MAXBODY / 100;
my_prop_info->VertBody = 0;
my_gadget =
init_gadget(100,10,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,PROPGADGET,my_text,window);
my_gadget->GadgetRender = (APTR) my_image;
my_gadget->SpecialInfo = (APTR) my_prop_info;
*var_value[fn_number] = min;
}
/* --------------------------------------------------------------
add a proportional gadget to the window structure
-------------------------------------------------------------- */
void add_yprop(title,min,max,window,flag)
int min,max;
char *title;
struct NewWindow *window;
int flag;
{
struct PropInfo *my_prop_info;
struct Gadget *my_gadget;
add_xprop(title,min,max,window,flag);
/* OK, not the finest style, but very efficient */
my_gadget = window->FirstGadget;
my_prop_info = (struct PropInfo *) my_gadget->SpecialInfo;
my_prop_info->Flags = FREEVERT | AUTOKNOB;
my_prop_info->VertBody = MAXBODY / 100 ;
my_prop_info->HorizBody = 0;
my_gadget->Width = 13;
my_gadget->Height = 100;
}
void CallBack_prop(gadget,window) /* no display of value */
struct Gadget *gadget;
struct Window *window;
{
struct PropInfo *my_prop_info;
int gadgetid;
int n;
int type,max,min;
gadgetid = gadget->GadgetID; type = var_funct[gadgetid];
my_prop_info = (struct PropInfo *) gadget->SpecialInfo;
if(type == SCALEY00) {
n = my_prop_info->VertPot;
} else {
n = my_prop_info->HorizPot;
}
max=scale_var1[gadgetid]; min=scale_var0[gadgetid];
n = min + (((max - min) * n) / MAXPOT);
*var_value[gadgetid] = n;
DrawPropBorder(gadget,window);
}
void CallBack_disp_prop(gadget,window) /* display value */
struct Gadget *gadget;
struct Window *window;
{
ULONG class;
ULONG code;
struct IntuiMessage *my_message;
struct PropInfo *my_prop_info;
struct IntuiText *my_text;
struct RastPort *rp;
char *strptr;
int gadgetid;
int n,m,x,y;
int type,max,min;
rp = window->RPort;
x = gadget->LeftEdge;
y = gadget->TopEdge;
gadgetid = gadget->GadgetID; type = var_funct[gadgetid]; m=129845;
my_prop_info = (struct PropInfo *) gadget->SpecialInfo;
while(1==1) {
my_message=(struct IntuiMessage *)GetMsg(window->UserPort);
if(my_message) {
class = my_message->Class; /* Save the IDCMP flag. */
code = my_message->Code;
ReplyMsg( my_message );
if( class = GADGETUP ) return;
}
if((type == SCALEY) || (type == SCALEY11)) {
n = my_prop_info->VertPot;
} else {
n = my_prop_info->HorizPot;
}
max=scale_var1[gadgetid]; min=scale_var0[gadgetid];
n = min + (((max - min) * n) / MAXPOT);
if(m!=n) {
my_text = gadget->GadgetText; my_text = my_text->NextText;
my_text->FrontPen = 0; PrintIText(rp,my_text,x,y);
strptr = (char *) my_text->IText; sprintf(strptr,"%d",n);
my_text->FrontPen = 1; PrintIText(rp,my_text,x,y);
DrawPropBorder(gadget,window);
*var_value[gadgetid] = n;
}
}
}
void DrawAllPropBorders(window)
struct Window *window;
{
struct Gadget *gadget;
gadget = window->FirstGadget;
while(gadget != NULL) {
gadget = gadget->NextGadget;
if(gadget->GadgetType == PROPGADGET) DrawPropBorder(gadget,window);
}
}
/* --------------------------------------------------------------
add toggle button to window
-------------------------------------------------------------- */
void add_toggle(title,window)
char *title;
struct NewWindow *window;
{
struct IntuiText *my_text;
struct Gadget *my_gadget;
my_text = init_text(title,10,0);
my_gadget =
init_gadget(7,7,GADGHCOMP,TOGGLESELECT|GADGIMMEDIATE,BOOLGADGET,my_text,window);
add_border(my_gadget,7,7);
*var_value[fn_number] = 0;
}
void CallBack_toggle(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
int gadgetid;
int n;
gadgetid = gadget->GadgetID;
*var_value[gadgetid] = 0;
if(gadget->Flags & SELECTED) *var_value[gadgetid] = 1;
}
void add_string(title,window)
char *title;
struct NewWindow *window;
{
int n;
struct IntuiText *my_text;
struct StringInfo *my_string_info;
struct Gadget *my_gadget;
UBYTE *buf, *undobuf;
my_text = init_text(title,0,12);
buf = (UBYTE *) tree_alloc(100); for(n=0;n<100;n++) buf[n]=0;
undobuf = (UBYTE *) tree_alloc(100); for(n=0;n<100;n++) undobuf[n]=0;
my_string_info = (struct StringInfo *) tree_alloc(sizeof(struct StringInfo));
my_string_info->Buffer = buf;
my_string_info->UndoBuffer = undobuf;
my_string_info->BufferPos = 0;
my_string_info->MaxChars = 99;
my_string_info->DispPos = 0;
my_gadget =
init_gadget(100,10,GADGHCOMP,RELVERIFY,STRGADGET,my_text,window);
my_gadget->SpecialInfo = (APTR) my_string_info;
add_border2(my_gadget,100,10);
}
void add_integer(title,window) /* NEW! */
char *title;
struct NewWindow *window;
{
struct Gadget *my_gadget;
add_string(title,window);
my_gadget = window->FirstGadget;
my_gadget->Activation = my_gadget->Activation | LONGINT;
}
void add_float(title,window) /* NEW! */
char *title;
struct NewWindow *window;
{
struct Gadget *my_gadget;
add_string(title,window);
my_gadget = window->FirstGadget;
my_gadget->Activation = my_gadget->Activation | STRINGRIGHT;
}
void CallBack_string(gadget,window) /* NEW! (modified) */
struct Gadget *gadget;
struct Window *window;
{
struct StringInfo *my_string_info;
struct StringInfo *path_info;
struct Gadget *gg, *path;
char *strptr, *pathptr;
char *s;
int gadgetid;
int i,n;
s = (char *) malloc(256);
gadgetid = gadget->GadgetID;
my_string_info = (struct StringInfo *) gadget->SpecialInfo;
strptr = (char *) my_string_info->Buffer; strcpy(s,strptr);
if(gadget->Activation == RELVERIFY) { /* simple string gadget */
if(var_funct[gadgetid] == FILE_SELECT) { /* special treatment for file selector box */
gg = (struct Gadget *) gadget->UserData;
for(i = 0; i < 5; i++) gg = gg->NextGadget;
path = (struct Gadget *) gg->UserData;
path_info = (struct StringInfo *) path->SpecialInfo;
pathptr = (char *) path_info->Buffer;
if((_instr(":",strptr) > 0) || (_instr("/",strptr) > 0)) {
strcpy(s,strptr);
} else {
strcpy(s,pathptr);
if((strlen(s) > 0) && (s[strlen(s)-1] != ':')) strcat(s,"/");
i = strlen(s); n=0; if(strptr[0] == 32) n = 1;
while(strptr[n] > 32) s[i++] = strptr[n++]; s[i]=0;
}
}
strcpy(var_value[gadgetid],s);
}
if(gadget->Activation & LONGINT) { /* integer gadget */
*var_value[gadgetid] = atoi(strptr);
}
if(gadget->Activation & STRINGRIGHT) { /* floating point gadget */
sscanf(strptr,"%f",var_value[gadgetid]);
}
free(s);
last_gadgetid = gadgetid;
if(gadgetid < 150) (*fn_command[gadgetid])();
}
void add_push(title,window)
char *title;
struct NewWindow *window;
{
int n,l;
struct IntuiText *my_text;
struct Gadget *my_gadget;
my_text = init_text(title,0,0);
l = strlen(title); n = 2 + ( l * 8 );
my_gadget =
init_gadget(n,9,GADGHIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,my_text,window);
add_border(my_gadget,n,9);
}
void CallBack_push(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
int gadgetid;
gadgetid = gadget->GadgetID;
if(gadgetid < 150) (*fn_command[gadgetid])();
}
void add_new_menu(title)
char *title;
{
int n,l;
char *my_text;
struct Menu *my_menu;
l = strlen(title); n = ( 8 * l ) + 15;
my_text = (char *)malloc(l+1); strcpy(my_text,title);
my_menu = (struct Menu*)malloc(sizeof(struct Menu));
my_menu->NextMenu = menu_bar;
my_menu->LeftEdge = menu_column; menu_column = menu_column + n;
my_menu->TopEdge = 0;
my_menu->Width = n;
my_menu->Height = 10;
my_menu->Flags = MENUENABLED;
my_menu->MenuName = my_text;
my_menu->FirstItem = NULL;
menu_bar = my_menu;
menu_line = 0;
}
void add_menu(title)
char *title;
{
struct IntuiText *my_text, *my_value;
struct MenuItem *my_item;
my_value = init_textstruct(fn_number,0);
my_text = init_text(title,0,1);
my_text->FrontPen = 2;
my_text->NextText = my_value;
my_item = (struct MenuItem *)malloc(sizeof(struct MenuItem));
my_item->NextItem = menu_bar->FirstItem;
my_item->LeftEdge = 0;
my_item->TopEdge = menu_line; menu_line = menu_line + 10;
my_item->Width = 150;
my_item->Height = 10;
my_item->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
my_item->MutualExclude = 0;
my_item->ItemFill = (APTR) my_text;
my_item->SelectFill = NULL;
my_item->Command = 0;
my_item->SubItem = NULL;
my_item->NextSelect = MENUNULL;
menu_bar->FirstItem = my_item;
}
void CallBack_menu(menu_number)
int menu_number;
{
struct MenuItem *item;
struct IntuiText *my_text, *my_value;
int n;
char *str;
item = (struct MenuItem *) ItemAddress(menu_bar,menu_number);
if(item == NULL) return;
my_text = (struct IntuiText *)item->ItemFill;
str = (char *) my_text->IText;
my_value = my_text->NextText;
n = my_value->LeftEdge;
last_gadgetid = n;
if((n>0) && (n < 150)) (*fn_command[n])();
}
/* -----------------------------------------------------------
Unterroutine zum Abschluss des Programm
----------------------------------------------------------- */
void close_gfx(struct Window *my_window)
{
if(my_window != NULL) CloseWindow(my_window);
CloseLibrary(GfxBase);
CloseLibrary(IntuitionBase);
}
/* -------------------------------------------------------------
create a simple requester with a message
------------------------------------------------------------- */
void Help(message)
char *message;
{
struct Window *helpwin;
struct RastPort *rp;
char c,s[80];
int l,ml,n,i;
int x,y;
BOOL close_me;
ULONG class;
ULONG code;
struct IntuiMessage *my_message;
close_me = FALSE;
ml=0 ; l=0; n=1; c=32; i=0;
while(c!=0) {
c = message[i++];
if(c == 0) break;
if(c == 10) {
n++; if(l > ml) ml = l;
l = 0;
}
l++;
}
n = 30 + n * 10; /* number of lines needed */
ml = 30 + ml * 8; /* number of columns needed */
helpwin = open_win(ml,n,"message:",0,3); rp = helpwin->RPort;
SetDrMd(rp,JAM1); SetAPen(rp,2); RectFill(rp,2,10,ml-2,n-2); SetAPen(rp,1);
x = 10 ; y = 30;
c=32; i=0; n=0;
while(c!=0) {
c = message[i++];
if(c <= 10) {
s[n] = 0;
Move(rp,x,y);
Text(rp,s,n);
n = 0; y = y + 10;
continue;
}
s[n++] = c;
}
while(!((*((UBYTE*)0xbfe001))&64)); /* wait for release of mouse button */
while(1 == 1) {
Delay(5L);
while(my_message=(struct IntuiMessage *)GetMsg(helpwin->UserPort)) {
class = my_message->Class; /* Save the IDCMP flag. */
code = my_message->Code;
ReplyMsg( my_message );
switch( class ) {
case CLOSEWINDOW: /* The user selected the Close window gadget! */
close_me=TRUE;
break;
}
}
if(close_me == TRUE) break;
if(!((*((UBYTE*)0xbfe001))&64)) break; /*left mouse button ? */
}
close_gfx(helpwin);
}
/* *************************************************************
selector box and fileselector box
************************************************************* */
struct Gadget *create_selector(x,y,b,title,window,items,fn)
char *title;
char **items;
int x,y,b,fn;
struct NewWindow *window;
{
struct Gadget *choiceg;
struct Gadget *slide;
struct Gadget *result;
struct Gadget *accept;
struct Gadget *cancel;
struct IntuiText *my_text;
struct Image *my_image;
struct PropInfo *my_prop_info;
struct StringInfo *my_string_info;
int n,m;
UBYTE *buf, *undobuf;
m = 2 + ( b * 8 );
/* stringbox */
my_text = init_text(title,0,-84);
buf = (UBYTE *) tree_alloc(100); for(n=0;n<100;n++) buf[n]=0;
undobuf = (UBYTE *) tree_alloc(100); for(n=0;n<100;n++) undobuf[n]=0;
my_string_info = (struct StringInfo *) tree_alloc(sizeof(struct StringInfo));
my_string_info->Buffer = buf;
my_string_info->UndoBuffer = undobuf;
my_string_info->BufferPos = 0;
my_string_info->MaxChars = 99;
my_string_info->DispPos = 0;
result =
init_gadget(m,10,GADGHCOMP,RELVERIFY,STRGADGET,my_text,window);
result->SpecialInfo = (APTR) my_string_info;
result->LeftEdge = x ;
result->TopEdge = y + 96 ;
result->GadgetID = fn ;
add_border2(result,m,10);
/* 7 push buttons for text window */
for(n=7;n>0;n--) {
my_text = init_textstruct(0,0); my_text->IText = (UBYTE *) items[n-1];
choiceg = init_gadget(m,10,GADGHNONE,GADGIMMEDIATE,BOOLGADGET,my_text,window);
choiceg->LeftEdge = x ;
choiceg->TopEdge = y + (10*n) + 12 ;
choiceg->GadgetID = SELBOXGAD ;
}
add_border(choiceg,m,70);
/* slider */
my_image = (struct Image *) tree_alloc(sizeof(struct Image));
my_prop_info = (struct PropInfo *) tree_alloc(sizeof(struct PropInfo));
my_prop_info->Flags = FREEVERT | AUTOKNOB;
my_prop_info->HorizPot = 0;
my_prop_info->VertPot = 0;
my_prop_info->HorizBody = 0;
my_prop_info->VertBody = MAXBODY / 100;
slide =
init_gadget(13,70,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,PROPGADGET,NULL,window);
slide->GadgetRender = (APTR) my_image;
slide->SpecialInfo = (APTR) my_prop_info;
slide->GadgetID = SPECIALPRO ;
slide->LeftEdge = x+m+2;
slide->TopEdge = y+22;
slide->UserData = (APTR) items;
/* ok button */
my_text = init_text("OK",0,0);
accept =
init_gadget(18,10,GADGHIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,my_text,window);
accept->LeftEdge = x ;
accept->TopEdge = y + 110 ;
accept->GadgetID = SPECIALOK ;
add_border(accept,18,10);
/* cancel button */
my_text = init_text("CANCEL",0,0);
cancel =
init_gadget(50,10,GADGHIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,my_text,window);
cancel->LeftEdge = x + 40;
cancel->TopEdge = y + 110 ;
cancel->GadgetID = SPECIALCAN ;
add_border(cancel,50,10);
result->UserData = (APTR) slide; /* IMPORTANT !!! */
return(result);
}
/* ------------------------------------------------
create a file selector box
------------------------------------------------ */
struct Gadget *create_fselect(x,y,b,title,window,items,fn)
char *title;
char **items;
int x,y,b,fn;
struct NewWindow *window;
{
struct Gadget *gg;
struct Gadget *strbox;
struct Gadget *slide;
struct Gadget *choice;
struct Gadget *parent;
struct IntuiText *my_text;
struct StringInfo *my_string_info;
int n,m;
UBYTE *buf, *undobuf;
m = 2 + ( b * 8 );
gg = create_selector(x,y+1,b,title,window,items,fn);
slide = (struct Gadget *) gg->UserData;
choice = slide->NextGadget;
/* add another stringbox */
buf = (UBYTE *) tree_alloc(200); for(n=0;n<200;n++) buf[n]=0;
undobuf = (UBYTE *) tree_alloc(200); for(n=0;n<200;n++) undobuf[n]=0;
my_string_info = (struct StringInfo *) tree_alloc(sizeof(struct StringInfo));
my_string_info->Buffer = buf;
my_string_info->UndoBuffer = undobuf;
my_string_info->BufferPos = 0;
my_string_info->MaxChars = 99;
my_string_info->DispPos = 0;
strbox =
init_gadget(m,10,GADGHCOMP,RELVERIFY,STRGADGET,NULL,window);
strbox->SpecialInfo = (APTR) my_string_info;
strbox->LeftEdge = x ;
strbox->TopEdge = y ;
strbox->GadgetID = FSELSTRING ;
strbox->UserData = (APTR) slide; /* IMPORTANT !!! */
add_border2(strbox,m,10);
for(n=0;n<7;n++) {
choice->UserData = (APTR) strbox; /* IMPORTANT !!! */
choice->GadgetID = FSELBOXGAD;
choice = choice->NextGadget;
}
/* add Parent Button */
my_text = init_text("Parent",0,0);
parent =
init_gadget(50,10,GADGHIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,my_text,window);
parent->LeftEdge = x + m - 50 ;
parent->TopEdge = y + 111 ; /* should be 110, WB 2.0 ? */
parent->GadgetID = SPECIALPAR ;
add_border(parent,50,10);
return(gg);
}
/* ------------------------------------------
call back functions for selection boxes
------------------------------------------ */
void CallBack_OK(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct StringInfo *my_string_info;
struct StringInfo *path_info;
struct Gadget *result;
struct Gadget *path;
char *strptr, *pathptr;
char *s;
int gadgetid;
int i,n;
s = (char *) malloc(256);
result = gadget->NextGadget;
while(1==1) {
if( result->GadgetType == STRGADGET ) break;
result = result->NextGadget;
}
gadgetid = result->GadgetID;
last_gadgetid = gadgetid;
my_string_info = (struct StringInfo *) result->SpecialInfo;
strptr = (char *) my_string_info->Buffer; strcpy(s,strptr);
if(var_funct[gadgetid] == FILE_SELECT) { /* special treatment for file selector box */
result = gadget;
while(result->GadgetID != FSELBOXGAD) result = result->NextGadget;
path = (struct Gadget *) result->UserData;
path_info = (struct StringInfo *) path->SpecialInfo;
pathptr = (char *) path_info->Buffer;
if((_instr(":",strptr) > 0) || (_instr("/",strptr) > 0)) {
strcpy(s,strptr);
} else {
strcpy(s,pathptr);
if((strlen(s) > 0) && (s[strlen(s)-1] != ':')) strcat(s,"/");
i = strlen(s); n=0; if(strptr[0] == 32) n = 1;
while(strptr[n] > 32) s[i++] = strptr[n++]; s[i]=0;
}
}
strcpy(var_value[gadgetid],s);
if(gadgetid < 150) (*fn_command[gadgetid])();
free(s);
}
void CallBack_CAN(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct Gadget *result;
int gadgetid;
result = gadget->NextGadget;
while(1==1) {
if( result->GadgetType == STRGADGET ) break;
result = result->NextGadget;
}
gadgetid = result->GadgetID;
strcpy(var_value[gadgetid],"");
if(gadgetid < 150) (*fn_command[gadgetid])();
}
void CallBack_SELBOX(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct StringInfo *my_string_info;
struct IntuiText *my_text;
struct Gadget *result;
char *strptr, *textptr;
int gadgetid;
my_text = gadget->GadgetText;
textptr = (char *) my_text->IText;
result = gadget->NextGadget;
while(1==1) {
if( result->GadgetType == STRGADGET ) break;
result = result->NextGadget;
}
gadgetid = result->GadgetID;
my_string_info = (struct StringInfo *) result->SpecialInfo;
strptr = (char *) my_string_info->Buffer;
if(strcmp(strptr,textptr)==0){ /* simple check for double click */
CallBack_OK(gadget,window);
return;
}
strcpy(strptr,textptr);
Refresh1Gadget(result,window);
}
/* read dir-string, read directory, update string list */
void CallBack_FSELSTRING(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct StringInfo *my_string_info;
struct IntuiText *my_text;
struct Gadget *slide;
struct Gadget *push;
char *strptr;
char **items;
char s[80];
int i;
slide = (struct Gadget *) gadget->UserData;
push = slide->NextGadget;
for(i=0;i<7;i++) {
my_text = push->GadgetText; my_text->FrontPen = 0;
Refresh1Gadget(push,window);
push = push->NextGadget;
}
items = (char **) slide->UserData;
my_string_info = (struct StringInfo *) gadget->SpecialInfo;
strptr = (char *) my_string_info->Buffer;
strcpy(s,strptr);
read_dir(s,items);
push = slide->NextGadget;
for(i=0;i<7;i++) {
my_text = push->GadgetText; my_text->IText = (UBYTE *) items[i];
if(items[i][0] == '/') {
my_text->FrontPen = 2;
} else {
my_text->FrontPen = 1;
}
Refresh1Gadget(push,window);
push = push->NextGadget;
}
}
/* read string, update dir-box, read directory, update strings */
void CallBack_FSELBOX(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct StringInfo *result_info;
struct StringInfo *path_info;
struct IntuiText *my_text;
struct Gadget *result;
struct Gadget *path;
char *strptr, *textptr, *pathptr;
int n,l;
char s[100];
my_text = gadget->GadgetText;
textptr = (char *) my_text->IText;
result = gadget->NextGadget;
while(1==1) {
if( result->GadgetType == STRGADGET ) break;
result = result->NextGadget;
}
path = (struct Gadget *) gadget->UserData;
result_info = (struct StringInfo *) result->SpecialInfo;
path_info = (struct StringInfo *) path->SpecialInfo;
strptr = (char *) result_info->Buffer;
pathptr = (char *) path_info->Buffer;
if(textptr[0] == '/') {
strcpy(s,pathptr);
l=strlen(s); n=0;
if(l==0) {
n = 1;
} else {
if(s[l-1] == ':') n=1;
}
while(textptr[n] > 32) s[l++] = textptr[n++]; s[l]=0;
strcpy(pathptr,s);
Refresh1Gadget(path,window);
CallBack_FSELSTRING(path,window); /* dirty trick, I know ! */
} else {
strcpy(s,textptr);
if(strcmp(strptr,s)==0){ /* simple check for double click */
CallBack_OK(gadget,window);
return;
}
strcpy(strptr,s);
Refresh1Gadget(result,window);
}
}
void CallBack_PAR(gadget,window)
struct Gadget *gadget;
struct Window *window;
{
struct StringInfo *my_string_info;
struct IntuiText *my_text;
struct Gadget *slide;
struct Gadget *push;
struct Gadget *dirgad;
struct FileLock *actdir, *pardir;
struct FileInfoBlock *dirinfo;
char *strptr;
char **items;
char s[80];
int i,n,m,flag;
dirgad = gadget->NextGadget;
slide = dirgad->NextGadget;
while(1==1) {
if(slide->GadgetType == PROPGADGET ) break;
slide = slide->NextGadget;
}
push = slide->NextGadget;
for(i=0;i<7;i++) {
my_text = push->GadgetText; my_text->FrontPen = 0;
Refresh1Gadget(push,window);
push = push->NextGadget;
}
items = (char **) slide->UserData;
my_string_info = (struct StringInfo *) dirgad->SpecialInfo;
strptr = (char *) my_string_info->Buffer;
strcpy(s,strptr);
i = strlen(s); flag = 0;
while(i > 0) {
if(s[i] == ':') {flag = 1 ; break;}
if(s[i] == '/') {flag = 1 ; s[i] = 0; break;}
s[i--] = 0;
}
if((i == 0) || (flag == 0)) {
dirinfo = (struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),0L);
actdir = (struct FileLock *) Lock(s,-2);
pardir = (struct FileLock *) ParentDir(actdir);
n = Examine(pardir,dirinfo);
m = 1; i = 0; s[0] = ':';
while(m != 0) {
m = dirinfo->fib_FileName[i++];
s[i] = m;
}
UnLock(actdir);
UnLock(pardir);
FreeMem(dirinfo,sizeof(struct FileInfoBlock));
}
strcpy(strptr,s);
Refresh1Gadget(dirgad,window);
read_dir(s,items);
push = slide->NextGadget;
for(i=0;i<7;i++) {
my_text = push->GadgetText; my_text->IText = (UBYTE *) items[i];
if(items[i][0] == '/') {
my_text->FrontPen = 2;
} else {
my_text->FrontPen = 1;
}
Refresh1Gadget(push,window);
push = push->NextGadget;
}
}
void CallBack_PRO(slide,window)
struct Gadget *slide;
struct Window *window;
{
ULONG class;
ULONG code;
struct IntuiMessage *my_message;
struct PropInfo *my_prop_info;
struct Gadget *push;
struct IntuiText *my_text;
char **items;
int i,n,m;
int max;
m=129845; items = (char **) slide->UserData;
max = 0; while(items[max] != NULL) max++;
max = max - 7;
my_prop_info = (struct PropInfo *) slide->SpecialInfo;
while(1==1) {
my_message=(struct IntuiMessage *)GetMsg(window->UserPort);
if(my_message) {
class = my_message->Class; /* Save the IDCMP flag. */
code = my_message->Code;
ReplyMsg( my_message );
if( class = GADGETUP ) return;
}
n = my_prop_info->VertPot; n = ((max * n) / MAXPOT);
if((m != n) & (n < max)) {
push = slide->NextGadget;
for(i=0;i<7;i++) {
my_text = push->GadgetText; my_text->FrontPen = 0;
Refresh1Gadget(push,window);
my_text->IText = (UBYTE *) items[n+i];
if(items[n+i][0] == '/') {
my_text->FrontPen = 2;
} else {
my_text->FrontPen = 1;
}
Refresh1Gadget(push,window);
push = push->NextGadget;
}
m = n;
}
}
}
/* ------------------------------------------------------------
now we can go and add these boxes
------------------------------------------------------------ */
void add_selector(title,window)
char *title;
struct NewWindow *window;
{
struct Gadget *gg;
char s[80],z[80];
char **items;
int m,i,l;
items = (char **)tree_alloc(1200);
for(i=0;i<300;i++) items[i] = NULL;
/* do string parsing for SELECTION box */
extract_str(s,title,0,',');
i=1; m=1;
while(m>0) {
m = extract_str(z,title,i,',');
l = strlen(z);
if(l == 0) break;
items[i-1] = (char *) tree_alloc(l+1) ; strcpy(items[i-1],z); i++;
}
gg=create_selector(acc_x,acc_y,20,s,window,items,fn_number);
}
void add_fselect(title,window)
char *title;
struct NewWindow *window;
{
struct Gadget *gg;
char **items;
int i;
items = (char **)tree_alloc(1200);
for(i=0;i<300;i++) items[i] = NULL;
read_dir("",items);
gg=create_fselect(acc_x,acc_y,20,title,window,items,fn_number);
}
/* -------------------------------------------------------------
create a file requester window
------------------------------------------------------------- */
void Try_Open_ASL()
{
if(AslBase != NULL) return;
AslBase = (struct Library *)OpenLibrary("asl.library",0);
}
void FileSelect(message,rtstr)
char *message,*rtstr;
{
struct FileRequester *FRptr;
struct Gadget *gg;
struct Window *win;
struct NewWindow *new_win;
struct memtree *recall;
struct Screen *WBS;
char **items;
int ml,n,i;
Try_Open_ASL();
WBS = (struct Screen *)OpenWorkBench();
if(WBScreen == NULL) WBScreen = WBS;
if(AslBase != NULL) {
ScreenToFront(WBS);
FRptr = AllocFileRequest();
strcpy(FRptr->rf_Dir,last_dir);
strcpy(FRptr->rf_File,last_file);
RequestFile(FRptr);
strcpy(last_dir,FRptr->rf_Dir);
strcpy(last_file,FRptr->rf_File);
strcpy(rtstr,FRptr->rf_Dir);
if(rtstr[0] != 0) {
if(rtstr[strlen(rtstr)-1] != ':') strcat(rtstr,"/");
}
strcat(rtstr,FRptr->rf_File);
FreeFileRequest(FRptr);
CloseLibrary(AslBase); AslBase = NULL;
ScreenToFront(WBScreen);
return;
}
items = (char **)malloc(1200);
for(i=0;i<300;i++) items[i] = NULL;
read_dir("",items);
recall = mem_status;
ml = 215 ; n = 140;
new_win = init_window(ml,n,"FileSelect by RAKO",0,3);
gg = create_fselect(15,15,20,message,new_win,items,150);
win = (struct Window *) OpenWindow(new_win);
var_funct[150] = FILE_SELECT; fin_flg = TRUE;
var_value[150] = rtstr;
MainLoop(win);
fin_flg = FALSE;
free(new_win);
n = 0;
while(items[n] != NULL) free(items[n++]);
free(items);
tree_free(recall);
}
/* -------------------------------------------------------------
create a string requester window
------------------------------------------------------------- */
void StringBox(message,rtstr)
char *message,*rtstr;
{
struct Gadget *gg;
struct Window *win;
struct NewWindow *new_win;
struct memtree *recall;
int ml,n;
recall = mem_status;
ml = 200 ; n = 70; fn_number = 150;
new_win = init_window(ml,n,"StringBox by RAKO",0,3);
acc_x = 20 ; acc_y = 30 ; add_string(message,new_win);
gg = new_win->FirstGadget;
while((gg->GadgetType && STRGADGET) == 0) {
gg = gg->NextGadget;
if(gg == 0) break;
}
gg->Flags = GADGHCOMP|SELECTED;
win = (struct Window *) OpenWindow(new_win);
ActivateWindow(win);
ActivateGadget(gg,win,0); /* why the hell does this not work ? */
var_funct[150] = STRING; fin_flg = TRUE;
var_value[150] = rtstr;
MainLoop(win);
fin_flg = FALSE;
free(new_win);
tree_free(recall);
}
/* -------------------------------------------------------------
add an item to the menu list
------------------------------------------------------------- */
void add_item(x,y,type,text,p1,p2)
int x,y,type,p1,p2;
char text[];
{
/* check, if position has to be adjusted */
if(x != -1) acc_x = x;
if(y != -1) acc_y = y;
if(fn_number > 149) {
Help("MDL Capacity exceeded, ask a wizzard to enlarge me\n");
printf("MDL Capacity exceeded, ask a wizzard to enlarge me\n");
return;
}
var_funct[fn_number] = type;
switch(type) {
case PUSH:
add_push(text,my_new_window);
acc_y = acc_y + (3 * bas_y);
break;
case TOGGLE:
add_toggle(text,my_new_window);
acc_y = acc_y + (3 * bas_y);
break;
case SCALEX:
add_xprop(text,p1,p2,my_new_window,1);
acc_y = acc_y + (8 * bas_y);
break;
case SCALEX00:
add_xprop(text,p1,p2,my_new_window,0);
acc_y = acc_y + (8 * bas_y);
break;
case SCALEY:
add_yprop(text,p1,p2,my_new_window,1);
acc_y = acc_y + (8 * bas_y);
break;
case SCALEY00:
add_yprop(text,p1,p2,my_new_window,0);
acc_y = acc_y + (22 * bas_y);
break;
case SCALEY11:
add_yprop(text,p1,p2,my_new_window,1);
acc_y = acc_y + (22 * bas_y);
break;
case SCALEX11:
add_xprop(text,p1,p2,my_new_window,1);
acc_y = acc_y + (8 * bas_y);
break;
case SELECTION:
add_selector(text,my_new_window);
acc_y = acc_y + (75 * bas_y);
break;
case STRING:
add_string(text,my_new_window);
acc_y = acc_y + (5 * bas_y);
break;
case INTEGER: /* NEW! */
add_integer(text,my_new_window);
acc_y = acc_y + (5 * bas_y);
break;
case FLOAT: /* NEW! */
add_float(text,my_new_window);
acc_y = acc_y + (5 * bas_y);
break;
case RADIO:
return;
break;
case FILE_SELECT:
add_fselect(text,my_new_window);
acc_y = acc_y + (90 * bas_y);
break;
case MENU:
add_menu(text);
break;
case NEW_MENU:
add_new_menu(text);
break;
default:
break;
}
}
/* -------------------------------------------------------------------
look for altered variables and assotiated gadgets, Update Gadgets
(Writes back altered wariables to Gadgets)
------------------------------------------------------------------- */
void UpdateGadgets(window) /* NEW! */
struct Window *window;
{
int gadgetid;
char *strptr;
struct Gadget *gadget;
struct StringInfo *my_string_info;
struct PropInfo *my_prop_info;
USHORT flags, horizpot, vertpot, horizbody, vertbody;
int type,max,min,m,n;
union intfp {
float fp;
int i;
} ifp;
gadget = window->FirstGadget;
while(gadget != NULL) {
gadget = gadget->NextGadget;
gadgetid = gadget->GadgetID;
if(gadget->Activation & TOGGLESELECT) {
n = *var_value[gadgetid];
m = 0; if(gadget->Flags & SELECTED) m = 1;
if(n == m) continue;
gadget->Flags |= SELECTED;
Refresh1Gadget(gadget,window);
if(n == 0) gadget->Flags -= SELECTED;
continue;
}
if(gadget->Flags & SELECTED) continue;
if((gadgetid < 150) && (gadgetid > 0)) {
if(gadget->GadgetType & STRGADGET) {
my_string_info = (struct StringInfo *) gadget->SpecialInfo;
strptr = (char *) my_string_info->Buffer;
if(var_funct[gadgetid] == STRING) { /* simple string */
strcpy(strptr,var_value[gadgetid]);
}
if(var_funct[gadgetid] == INTEGER) { /* integer gadget */
sprintf(strptr,"%d",*var_value[gadgetid]);
my_string_info->LongInt = *var_value[gadgetid];
}
if(var_funct[gadgetid] == FLOAT) { /* floating point gadget */
ifp.i = *var_value[gadgetid];
sprintf(strptr,"%f",(double)ifp.fp);
}
Refresh1Gadget(gadget,window);
continue;
}
if(gadget->GadgetType == PROPGADGET) {
max=scale_var1[gadgetid]; min=scale_var0[gadgetid];
n = *var_value[gadgetid];
m = (max - min);
if(m == 0) continue;
n = (n - min) * MAXPOT / m;
flags = gadget->Flags;
my_prop_info = (struct PropInfo *) gadget->SpecialInfo;
horizpot = my_prop_info->HorizPot;
vertpot = my_prop_info->VertPot;
horizbody = my_prop_info->HorizBody;
vertbody = my_prop_info->VertBody;
type = var_funct[gadgetid];
if((type == SCALEY) || (type == SCALEY11) || (type == SCALEY00)) {
vertpot = n;
} else {
horizpot = n;
}
/* !!!!!!!!!!!!!!!! Makes Trouble !!!!!!!!!!!!!!!!
NewModifyProp(gadget,window,NULL,flags,horizpot,vertpot,horizbody,vertbody,0);
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
}
}
}
}
MainLoop(window)
struct Window *window;
{
BOOL close_me;
ULONG class;
ULONG code;
struct IntuiMessage *my_message;
struct Gadget *my_gadget;
close_me = FALSE;
DrawAllPropBorders(window);
UpdateGadgets(window);
while( close_me == FALSE )
{
Wait( 1 << window->UserPort->mp_SigBit );
while(my_message=(struct IntuiMessage *)GetMsg(window->UserPort))
{
class = my_message->Class; /* Save the IDCMP flag. */
code = my_message->Code;
ReplyMsg( my_message );
switch( class )
{
case CLOSEWINDOW: /* The user selected the Close window gadget! */
close_me=TRUE;
break;
case GADGETDOWN: /* The user has selected a gadget: */
close_me=read_gadgets(my_message,window);
break;
case GADGETUP: /* The user has released a gadget: */
my_gadget = (struct Gadget *) my_message->IAddress;
if(my_gadget->GadgetType == STRGADGET) {
close_me=read_gadgets(my_message,window);
}
break;
case MENUPICK:
CallBack_menu(code);
break;
}
UpdateGadgets(window);
}
}
close_gfx(window);
}
read_gadgets(message,window)
struct IntuiMessage *message;
struct Window *window;
{
struct Gadget *my_gadget;
int gadgetid;
int class,type;
class = message->Class; /* Save the IDCMP flag. */
my_gadget = (struct Gadget *) message->IAddress;
gadgetid = my_gadget->GadgetID;
last_gadgetid = gadgetid;
if(gadgetid > 200) {
switch(gadgetid) {
case SELBOXGAD:
CallBack_SELBOX(my_gadget,window);
break;
case FSELBOXGAD:
CallBack_FSELBOX(my_gadget,window);
break;
case FSELSTRING:
CallBack_FSELSTRING(my_gadget,window);
break;
case SPECIALPRO:
CallBack_PRO(my_gadget,window);
break;
case SPECIALOK:
if(class == GADGETDOWN) {
CallBack_OK(my_gadget,window);
return(fin_flg);
}
break;
case SPECIALPAR:
if(class == GADGETDOWN) CallBack_PAR(my_gadget,window);
break;
case SPECIALCAN:
if(class == GADGETDOWN) {
CallBack_CAN(my_gadget,window);
return(fin_flg);
}
break;
}
return(FALSE);
}
type = var_funct[gadgetid];
switch(type) {
case SCALEX:
case SCALEY:
case SCALEX11:
case SCALEY11:
prop_gadget = my_gadget;
prop_window = window;
CallBack_disp_prop(my_gadget,window);
if(class == GADGETDOWN) propdwn = -1;
if(class == GADGETUP) propdwn = 0;
break;
case SCALEX00:
case SCALEY00:
prop_gadget = my_gadget;
prop_window = window;
CallBack_prop(my_gadget,window);
if(class == GADGETDOWN) propdwn = -1;
if(class == GADGETUP) propdwn = 0;
break;
case TOGGLE:
CallBack_toggle(my_gadget,window);
break;
case STRING:
case INTEGER:
case FLOAT:
CallBack_string(my_gadget,window);
return(fin_flg);
break;
case PUSH:
if(class == GADGETDOWN) CallBack_push(my_gadget,window);
break;
case SELECTION:
CallBack_string(my_gadget,window);
break;
case FILE_SELECT:
CallBack_string(my_gadget,window);
return(fin_flg);
break;
default:
printf("unknown function: %d gadgetID= %d \n",type,gadgetid);
break;
}
return(FALSE);
}
/* ********************************************************************
S T R I N G H A N D L I N G
******************************************************************** */
/* --------------------------------------------------
reurns in s1 s2 from nth occurence of c up to c
-------------------------------------------------- */
extract_str(s1,s2,n,c)
char s1[],s2[],c;
int n;
{
int m,i,l;
char c1;
m=0; l=strlen(s2);
i = 0;
if(n > 0) {
for(i=0;i<l;i++) {
c1=s2[i];
if(c1 == c) m++;
if(m == n) break;
}
s1[0] = 0;
if(c1 != c) return(-1);
i++;
}
m=0;
while(i<l) {
c1 = s2[i++];
if(c1 == c) break;
s1[m++] = c1;
}
s1[m] = 0;
if(strlen(s1)==0) return(-1);
return(1);
}
void dummy()
{
}
void set_new_pointer()
{
int n;
PointerMatrix = (USHORT *) AllocMem(256,MEMF_CHIP|MEMF_PUBLIC);
PointerMatrix[0] = 0 ;
PointerMatrix[1] = 0 ;
PointerMatrix[2] = 0x8001 ;
PointerMatrix[4] = 0x4002 ;
PointerMatrix[6] = 0x2004 ;
PointerMatrix[8] = 0x1008 ;
PointerMatrix[10] = 0x0810 ;
PointerMatrix[12] = 0x0420 ;
PointerMatrix[14] = 0x0240 ;
PointerMatrix[16] = 0x0180 ;
PointerMatrix[18] = 0x0240 ;
PointerMatrix[20] = 0x0420 ;
PointerMatrix[22] = 0x0810 ;
PointerMatrix[24] = 0x1008 ;
PointerMatrix[26] = 0x2004 ;
PointerMatrix[28] = 0x4002 ;
PointerMatrix[30] = 0x8001 ;
for(n = 3 ; n<32 ; n = n + 2) PointerMatrix[n] = 0;
SetPointer(my_window,PointerMatrix,(short) 15, (short) 15, (short) -8, (short) -8);
}
void set_old_pointer()
{
ClearPointer(my_window);
FreeMem(PointerMatrix,256);
}
RequestYesNo(text)
char *text;
{
int n;
struct IntuiText body=
{ 0, 0, JAM1, 15, 5, NULL,
">>>>>>>>>>>>>>>!!!!!! Undefined Yes / No Requester !!!!!!!<<<<<<<<<<<<<<<<<<",
NULL};
struct IntuiText yes=
{ 0, 0, JAM1, 6, 3, NULL, "YES", NULL};
struct IntuiText no=
{ 0, 0, JAM1, 6, 3, NULL, "NO", NULL};
strcpy(body.IText,text);
n = 8 * strlen(text) + 50;
return(AutoRequest( NULL, &body, &yes, &no, NULL, NULL, n, 72));
}
_instr(substr,str)
char str[],substr[];
{
int i,p,flg,l1,l2;
l1=strlen(str); l2=strlen(substr);
for(p=0; p < l1; p++) {
flg=0;
for(i=0; i < l2; i++) {
if(str[p+i] != substr[i]) {
flg = -1; break;
}
}
if(flg == 0) return(p);
}
return(-1);
}